SOC是一个端到端的服务,为RTOS、Linux、Android操作系统的物联网终端提供安全审计。本文介绍了如何在Android系统中集成企业版或旗舰版SOC。
前提条件
已通过IoT安全中心获取企业版或旗舰版SOC SDK。也可以单击下载SOC for Android SDK。
安全运营管理-SOC(企业版)、安全运营管理-SOC(旗舰版),以下简称:SOC SDK。
SOC SDK Native集成
步骤一:集成SOC SDK到Android ROM编译环境
将下载好的SOC SDK保存到具有Android设备源代码及编译环境的计算机上,并解压缩到任一目录。
将dps_sdk目录复制到
$ANDROID_SOURCE_HOME/external
目录下。在目标产品的Android makefile当中配置编译dps_sdk包,在device.mk(或对等功能的文件)当中加入以下代码:
# build dps_sdk $(call inherit-product-if-exists,external/dps_sdk/dps_sdk.mk)
打开编辑
$ANDROID_SOURCE_HOME/external/dps_sdk/dps_sdk.mk
文件,编译内容如下:PRODUCT_PACKAGES += \ dps_domain \ dps_services \ dps_pro \ dps_extras \ itls_client \
编译内容
是否必选
描述
dps_domain
是
提供基础文件系统取证、进程分析、完整性检查功能,需要默认开启。
dps_services
是
dps_pro
否
属于高阶功能,可提供进程行为、网络行为分析、漏洞修复等功能,建议开启,但开启后需要对Android系统上运行的APP做一些覆盖兼容性测试。
dps_extra
否
属于增强型工具,如果需要使用安全沙箱、安全控制台、安全网络扫描组件,请按需包含。
itls_client
否
为SOC增强型上云连接通道,基于 ID² 和 TEE CAP 鉴权上云,如果需要请包含,并参考“接入公有云物联网安全中心”中的“方法一”进行适当配置。
步骤二:编译前配置
用户可以在
$ANDROID_SOURCE_HOME/external/dps_sdk/packages/configure.ini
当中进行服务参数的配置,请参见configure.ini配置。说明一般而言这个配置文件在SDK输出时已经配置好,ISV用户仅需要审核和微调,微调部分如下:在Android产品当中,往往会采用一个property属性来保存产品固件的版本号,每当产品进行OTA或者有线烧录的时候,这个版本号都会发生变化。请根据您的产品当中具体的这个属性值,对
$ANDROID_SOURCE_HOME/external/dps_sdk/packages/configure.ini
当中的MANAGED_VERSION进行仿写配置即可。SOC SDK为Android 7.0以上版本提供了支持原生AOSP的SELinux和Seccomp安全策略,请在开始编译产品镜像之前,确认SELinux和Seccomp policy被加入到Android源代码当中($DPS_SDK指代DPS SDK目录):
找到对应的Android版本的SEPolicy目录,将
$DPS_SDK/policy/sepolicy/dps_file_contexts当中的内容复制并粘贴到file_contexts
文本最末尾。找到对应的Android版本的SEPolicy目录,将
$DPS_SDK/policy/sepolicy/dps_android_X.te
拷贝至该目录并重命名为dps.te。其中X代表Android版本对应字母号。找到Android源代码的
frameworks/av/services/mediacodec/minijail/seccomp_policy
目录,将$DPS_SDK/policy/seccomp_policy/dps_mediacodec-seccomp-arm.policy
当中的内容复制并粘贴到mediacodec-seccomp-arm.policy
文件末尾。找到Android源代码的
frameworks/av/services/mediaextractor/minijail/seccomp_policy
目录,将$DPS_SDK/policy/seccomp_policy/dps_mediaextractor-seccomp-arm.policy
当中的内容复制并粘贴到mediaextractor-seccomp-arm.policy
文件末尾。再将$DPS_SDK/policy/seccomp_policy/dps_mediaextractor-seccomp-x86.policy
当中的内容复制并粘贴到mediaextractor-seccomp-x86.policy
文件末尾。
说明在Android 8以上的版本中,需要额外配置vendor的SEPolicy,一个vendor相关的定制 SEPolicy,范例请参考:
policy/sepolicy/vendor/dps_android_o_bullhead.te
。
步骤四:(可选)内核安全增强
非必选步骤,针对内核审计相关强安全需求的用户,请参见Linux 内核功能依赖参考。
步骤五:确认集成是否成功
开发阶段请务必将SELinux置为permissive模式,具体方法为在产品的BoardConfig.mk文件里加入一行如下命令:
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
完成上述的步骤之后,就可以按照通常设备ROM编译的方式进行编译了。编译结束之后通过几个checklist来确保SOC SDK成功集成到了设备ROM:
在编译工作机上,进入
$ANDROID_SOURCE_HOME/out/target/<your_product>/
目录。确认system/bin/logd不存在。
确认system/bin/linker64以及system/bin/linker形成符号链接,指向./dps/bin/linker64和./dps/bin/linker。
确认system/bin/目录下具有dps文件夹,即/system/bin/dps存在,其中具有bin,lib(64),etc三个文件夹。
确认system/etc/init目录下存在dps.rc文件。
确认system/etc/seccomp_policy当中几个.policy文件以及/vendor/etc/seccomp_policy当中的几个.policy文件中含有DPS指定的syscall白单。
完成上述确认之后尝试刷机,并且进行开机check list:
可以正常启动到launcher,adb功能以及logcat功能正常。
adb shell进入系统,通过ps命令,确认三个进程dpsd、logd、sagent均稳定运行(1分钟以内进程号不变)。
接入公有云物联网安全中心
SOC SDK需要和阿里云物联网平台服务端之间建立一个安全的MQTT连接,才能正常工作,因此,我们需要将它接入阿里云物联网平台。
下面介绍常用的两种接入阿里云物联网的方式,在集成过程中,只需要根据实际需求选中其中一种方式即可。
方法一:推荐用于没有集成TEE-PRO的Android设备。
方法二:推荐用于已经集成了TEE-PRO的Android设备。
方法一:复用ID²+TEE-CAP建立的iTLS上云通道
在目标设备Android系统当中,如果事先没有集成TEE-PRO,则可以通过APP+Linkkit SDK+ID²+TEE CAP建立iTLS上云通道,同时这个通道也可以给SOC复用。我们推荐您使用这种方式让SOC SDK连入阿里云物联网,通过ID²认证的MQTT over iTLS通道可以让你的数据传输更加安全。
整体的数据链路通道如下图所示:具体操作步骤如下:
在
$ANDROID_SOURCE_HOME/external/dps_sdk/dps_sdk.mk
文件中确认启用了itls_client选项。使用PC浏览器打开阿里云物联网平台控制台。
进入控制台之后单击对应的实例,在左侧导航栏,选择设备管理 > 产品,单击创建产品。
重要认证方式必须选择ID²。
创建成功后,进入产品详情页面,单击上方Product Secret右侧的查看按钮,获取产品证书信息。
说明请妥善保管产品证书信息,对应ProductKey和ProductSecret在后续步骤中会使用。
在Android Studio导入的SDK包中找到
$ANDROID_SOURCE_HOME/external/dps_sdk/client/example/itls_client
应用程序工程,选择res/raw/deviceinfo文件,请将ProductKey和ProductSecret填入相应的字段。测试阶段可以在这里填写每个设备的身份标识到deviceName字段。{ "productKey": "<your_product_key>", "deviceName": "<unique_id_of_device>", "productSecret": "<your_product_secret>", "deviceSecret": "itls_secret", "subDevice": [ { "productKey": "", "deviceName": "" }, { "productKey": "", "deviceName": "" } ] }
完成之后编译运行这个APP,可使用自签证书对其进行签名,并输入打包好的apk文件,命名为itls_client.apk,复制到
dps_sdk/client/prebuilt/itls_client.apk
。重新编译系统镜象,此时这个itls_client.apk会被预装到目标设设备,开机自启动且在有网络连接的时候自动接入阿里云物联网平台。
安全开发实践建议:
上述的ProductKey和ProductSecret是产品账号的私密信息,建议不要明文配置到deviceinfo,而是通过nvram烧录等方式配置到ROM,并在APP当中通过接口获取。
上述的deviceName由于当前产品的每个出货的设备个体都需要做到不相同,因此建议您根据自身设备ID对这个字段进行配置和获取(譬如使用IMEI,MAC或者烧录到nvram的设备ID等)。
请对上述APP进行改造,确保系统开机之后自动启动(注册BOOT_COMPLETED broadcast receiver),以及网络切换之后重新激活。
其它隐藏APP界面,launcher图标等您可自行决定处理。
方法二:自定义客户端接入上云
如果希望自定义客户端接入时,可使用SOC提供的客户端示例代码,自行修改后完成客户端上云。
客户端示例代码可参考SDK的client目录。您也可以独立编译,编译步骤如下:
请在dps_sdk.mk的PRODUCT_PACKAGES列表中添加cloud_agent_example项。
请自行在Android init.rc文件中启动客户端服务。并在SDK的packages/service.ini文件当中注释掉start sagent项目。
按照正常方式编译设备镜像,cloud_agent_example会被编译至镜像的/system/bin/目录下。